/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.lm.view;

import br.com.lm.base.eao.EaoException;
import br.com.lm.entity.CtrlObjetoAcesso;
import br.com.lm.entity.CtrlPerfil;
import br.com.lm.entity.CtrlPerfilAcesso;
import br.com.lm.entity.CtrlPerfilAcessoPK;
import br.com.lm.entity.CtrlUsuario;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

public class CtrlMenuStaticBean {

    private FacesContext ctx = FacesContext.getCurrentInstance();
    
    public CtrlUsuario usuarioAutenticado;
    public Map<CtrlPerfilAcessoPK, List<CtrlObjetoAcesso>> mapModuloObjAcesso;
    public String objNavegacao = null;
    public String[] objetosAutoriz = new String[]{};
    
    public HttpSession session;

    /*
     * Menu estatico
     */
    public CtrlMenuStaticBean() {        
        session = (HttpSession) ctx.getExternalContext().getSession(false);
        boolean redirecionaNavegacao = false;
        try {
            usuarioAutenticado = (CtrlUsuario)session.getAttribute("usuarioAutenticado");
            mapModuloObjAcesso = (Map<CtrlPerfilAcessoPK, List<CtrlObjetoAcesso>>)session.getAttribute("mapModuloObjAcesso");
            if (!checkPerfilAcesso()) 
                redirecionaNavegacao = true;
        } catch (Exception ex) {
            Logger.getLogger(CtrlMenuStaticBean.class.getName()).log(Level.SEVERE, null, ex);
            addMessage("Login Expirado... Entre novamente no sistema LM!");
            redirecionaNavegacao = true;
        }
        finally {
            try {
                if (redirecionaNavegacao) {
                    ctx.getExternalContext().redirect(ctx.getExternalContext().getRequestContextPath() + "/login.jsf");
                }    
            } catch (IOException ex1) {
                Logger.getLogger(CtrlMenuStaticBean.class.getName()).log(Level.SEVERE, null, ex1);
            }
        }
    }

    /*
     * Home page
     */ 
    public final void home() throws IOException {
        ctx = FacesContext.getCurrentInstance();
        ctx.getExternalContext().redirect(ctx.getExternalContext().getRequestContextPath() + "/home.jsf");
    }

    /*
     * Mensagens do sistema
     */
    public final void addMessage(String summary) {
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, summary, null);
        FacesContext.getCurrentInstance().addMessage(null, message);
    }
    
    /*
     * Objeto de Navegacao (Pagina, View, Url, e etc)
     */
    public String getObjNavegacao() {
        return objNavegacao;
    }
    
    /*
     * Objetos de Autorizacao usado na Navegacao
     */
    public String[] getObjetosAutorizacao() {
        return objetosAutoriz;
    }
    
    /*
     * Verifica perfil do usuario
     */ 
    private boolean checkPerfilAcesso() {       
        boolean lReturn = false; 
        StringBuilder sb = new StringBuilder();
        
        //Verifica o status do perfil do usuário
        CtrlPerfil perfil = usuarioAutenticado.getIdPerfil();
        Character stsPefil = perfil.getStsPerfil() == null || perfil.getStsPerfil().equals(Character.valueOf('\u0000')) 
                             ? 'L' : perfil.getStsPerfil();
        if (stsPefil.equals('B')) {
            sb.append("Perfil[");
            sb.append(perfil.getDscPerfil());
            sb.append("] bloqueado! Contactar Administrador do sistema LM.");
            addMessage(sb.toString());
        }
        else 
        if (stsPefil.equals('D')) {
            sb.append("Perfil[");
            sb.append(perfil.getDscPerfil());
            sb.append("] desativado! Contactar Administrador do sistema LM.");
            addMessage(sb.toString());
        }
        else
        lReturn = true;
        return lReturn;
    }   

    /*
     * Identifica qual modulo pode ser liberado no menu
     */
    public boolean checkModuloAcesso(String nomeModulo) throws EaoException {
        boolean lReturn = false;  
        String lMensagem = "";       
        Collection<CtrlPerfilAcesso> ctrlAcesso = usuarioAutenticado.getIdPerfil().getCtrlPerfilAcessoCollection();
        if (ctrlAcesso != null) {                     
            while (ctrlAcesso.iterator().hasNext()) {
                CtrlPerfilAcesso ctrlPerfilAcesso = ctrlAcesso.iterator().next();
                if (ctrlPerfilAcesso.getCtrlModuloRoot().getDscModulo().equals(nomeModulo)) {
                    lMensagem = checkModuloRoot(ctrlPerfilAcesso);
                    if (lMensagem == null || lMensagem.trim().equals(""))
                        lReturn = true;
                    break;
                }
                else 
                if (ctrlPerfilAcesso.getCtrlModuloItem().getDscModulo().equals(nomeModulo)) {
                    lMensagem = checkModuloItem(ctrlPerfilAcesso);
                    if (lMensagem == null || lMensagem.trim().equals(""))
                        lReturn = true;
                    break;
                }
            }
            //Registra mensagens no LOG do sistema (Menu Bloquedo ou Desativado
            if (lMensagem != null && !lMensagem.trim().equals("")) {
                Logger.getLogger(CtrlMenuStaticBean.class.getName()).log(Level.INFO,lMensagem);
            }    
        }
        //Se Houve inconsistencias... 
        if (!lReturn) {
            //E não capturado a mensagem, entao assume erro padrao! 
            if (lMensagem == null || lMensagem.trim().equals("")) {  
                //Isto provavelmente nao vai acontecer!!!!
                addMessage("Usuário sem Acesso a esse Módulo");
            }    
        }        
        return lReturn;
    }   
    
    /*
     * Consistencia para menu de root
     */
    private String checkModuloRoot(CtrlPerfilAcesso ctrlPerfilAcesso) throws EaoException {
        //Nao ha validacao para o root
        if (ctrlPerfilAcesso != null) {
            //Processar aqui qualquer consistencia qua haja necessidade
        }
        return null;
    }

    /*
     * Consistencia para menu de item
     */
    private String checkModuloItem(CtrlPerfilAcesso ctrlPerfilAcesso) throws EaoException {
        StringBuilder sb = new StringBuilder();
        objNavegacao = null;
        String msg = null;
        Character stsPefil = ctrlPerfilAcesso.getStsModuloItem() == null ? 'L' : ctrlPerfilAcesso.getStsModuloItem();
        if (stsPefil.equals('B')) 
            msg = "Módulo [" + ctrlPerfilAcesso.getCtrlModuloItem().getDscModulo() + "] bloqueado para o acesso!";           
        else 
        if (stsPefil.equals('D')) 
            msg = "Módulo [" + ctrlPerfilAcesso.getCtrlModuloItem().getDscModulo() + "] desativado para o acesso!";                           
        else {
            //Ok - Modulo Item validado!
            objNavegacao = ctrlPerfilAcesso.getCtrlModuloItem().getAplModulo();
            //Busca os Objetos de Autorizacao se houver...
            if (ctrlPerfilAcesso.getIdObjAutoriz() != null && ctrlPerfilAcesso.getIdObjAutoriz() > 0) {
               if (mapModuloObjAcesso.containsKey(ctrlPerfilAcesso.getCtrlPerfilAcessoPK())) {
                   List<CtrlObjetoAcesso> objs = mapModuloObjAcesso.get(ctrlPerfilAcesso.getCtrlPerfilAcessoPK());
                   objetosAutoriz = new String[objs.size()];
                   int idx = 0;
                   for(CtrlObjetoAcesso obj: objs) {
                     sb.setLength(0);
                     sb.append(obj.getNomObj01());
                     if (obj.getNomObj02() != null && !obj.getNomObj02().trim().equals("")) {
                         sb.append("|"); //Separador pipe
                         sb.append(obj.getNomObj02());
                     }
                     if (obj.getExtObjs() != null && !obj.getExtObjs().trim().equals("")) {
                         sb.append("|"); //Separador pipe
                         sb.append(obj.getExtObjs());
                     }
                     objetosAutoriz[idx++] = sb.toString();                       
                   }
               }    
               else {
                   //Erro grave, identificacao do objeto de autorizacao sem correspondencia na base de dados
               }                             
            }            
        }
        return msg;
    }    
    
}
